package es.exitae.ejerciciofinal;

import static es.exitae.ejerciciofinal.utils.Constantes.CODIGO_NUEVO_LUGAR;
import static es.exitae.ejerciciofinal.utils.Constantes.TAG_ID_LUGAR;
import static es.exitae.ejerciciofinal.utils.Constantes.TAG_LATITUD;
import static es.exitae.ejerciciofinal.utils.Constantes.TAG_LONGITUD;
import static es.exitae.ejerciciofinal.utils.Constantes.TAG_REQUEST_CODE;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;
import android.view.MenuItem;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnMapClickListener;
import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

import es.exitae.ejerciciofinal.dto.CargaDTOs;
import es.exitae.ejerciciofinal.dto.LugarDTO;
import es.exitae.ejerciciofinal.provedorCont.EjercicioFinalProvider;
import es.exitae.ejerciciofinal.provedorCont.tablas.Lugares;
import es.exitae.ejerciciofinal.servicios.ServicioGeolocalizacion;
import es.exitae.ejerciciofinal.utils.Traza;
import es.exitae.ejerciciofinal.utils.enums.Metodo;

public class MapaLugaresActivity extends FragmentActivity implements OnMapClickListener, OnMarkerClickListener, LocationListener
{
	private CargaDTOs cargar;
	private GoogleMap mapa;
	
	private ServicioGeolocalizacion geolocalizacion;

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		Traza.d(Metodo.ENTRADA);
		super.onCreate(savedInstanceState);
		setContentView(R.layout.mapa_activity);

		mapa = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
		mapa.setMapType(GoogleMap.MAP_TYPE_NORMAL);
		mapa.setMyLocationEnabled(true);
		mapa.setOnMapClickListener(this);
		mapa.setOnMarkerClickListener(this);

		cargar = new CargaDTOs(getContentResolver());
		
		LocationManager locationManaget = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
		geolocalizacion = new ServicioGeolocalizacion(locationManaget);
		geolocalizacion.cargarUltimaPosicionConocida();
		geolocalizacion.setZoon(14);
		geolocalizacion.actualizarMapa(mapa);

		Traza.d(Metodo.SALIDA);
	}

	@Override
	protected void onResume()
	{
		Traza.d(Metodo.ENTRADA);
		super.onResume();
		cargarMarcasMapa();
		Traza.d(Metodo.SALIDA);
	}

	/**
	 * Limpia el mapa y vuelve a generar todas las marcas guardadas en la BD
	 */
	private void cargarMarcasMapa()
	{
		Traza.d(Metodo.ENTRADA);
		Uri url = Uri.parse(EjercicioFinalProvider.LUGARES_URI);

		String[] projection = { Lugares.COL_NOMBRE, Lugares.COL_LATITUD, Lugares.COL_LONGITUD };

		Cursor resultado = getContentResolver().query(url, projection, null, null, Lugares.DEFAULT_SORT_ORDER);

		if (resultado.moveToFirst())
		{
			mapa.clear();
			do
			{
				MarkerOptions marca = new MarkerOptions();
				marca.position(new LatLng(resultado.getDouble(1), resultado.getDouble(2)));
				marca.title(resultado.getString(0));

				mapa.addMarker(marca);
			} while (resultado.moveToNext());
		}
		Traza.d(Metodo.SALIDA);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		getMenuInflater().inflate(R.menu.mapa, menu);
		return true;
	}


	@Override
	public void onMapClick(LatLng arg0)
	{
		Traza.d(Metodo.ENTRADA);
		Intent i = new Intent(this, EditarLugarActivity.class);
		i.putExtra(TAG_LATITUD, arg0.latitude);
		i.putExtra(TAG_LONGITUD, arg0.longitude);
		i.putExtra(TAG_REQUEST_CODE, CODIGO_NUEVO_LUGAR);
		
		startActivityForResult(i, CODIGO_NUEVO_LUGAR);
		Traza.d(Metodo.SALIDA);
	}


	@Override
	public boolean onMarkerClick(Marker marker)
	{
		Traza.d(Metodo.ENTRADA);
		LugarDTO lugar = new LugarDTO();
		lugar.setNombre(marker.getTitle());
		lugar.setCoodenadas(marker.getPosition());

		int idLugar = cargar.getID(lugar);

		Intent i = new Intent(this, MostrarLugarActivity.class);
		i.putExtra(TAG_ID_LUGAR, idLugar);

		startActivity(i);

		Traza.d(Metodo.SALIDA);
		return idLugar > 0;
	}

	@Override
	public boolean onMenuItemSelected(int featureId, MenuItem item)
	{
		Traza.d(Metodo.ENTRADA);
		switch (item.getItemId())
		{
		case R.id.menuMapa_H:
			mapa.setMapType(GoogleMap.MAP_TYPE_HYBRID);
			break;
		case R.id.menuMapa_N:
			mapa.setMapType(GoogleMap.MAP_TYPE_NORMAL);
			break;
		case R.id.menuMapa_T:
			mapa.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
			break;
		case R.id.menuMapa_S:
			mapa.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
			break;
		default:
			return false;
		}
		Traza.d(Metodo.SALIDA);
		return true;
	}

	@Override
	public void onLocationChanged(Location loc)
	{
		geolocalizacion.setPosicion(loc);
	}

	@Override
	public void onProviderDisabled(String provider)
	{

	}

	@Override
	public void onProviderEnabled(String provider)
	{

	}

	@Override
	public void onStatusChanged(String provider, int status, Bundle extras)
	{

	}

}
